/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.celiosilva.simbanc.arquitetura;

import com.celiosilva.simbanc.beans.Usuario;
import com.celiosilva.simbanc.business.seguranca.Permissao;
import com.celiosilva.simbanc.exceptions.AcessoNegadoException;
import java.util.HashSet;
import java.util.Set;

/**
 *
 * @author celio@celiosilva.com
 */
public class Sessao {

    private final               Usuario                 usuario;
    private static              Sessao                  instance;

    private Sessao(String login, String senha, Permissao... permissoes) {
        this.usuario = new Usuario();
        usuario.setLogin(login);
        usuario.setSenha(senha);
        Set<Permissao> permissoesUsuario = new HashSet<Permissao>();
        for (Permissao p: permissoes)
            permissoesUsuario.add(p);
        usuario.setPermissoes(permissoesUsuario);
    }

    public static final Sessao iniciarSessao(String login, String senha){
        if (instance == null)
            instance = new Sessao(login, senha, Permissao.values());
        else
            throw new IllegalStateException("A sessão ja foi inicializada anteriormente");
        return instance;
    }

    public static Sessao getInstance() {
        if (instance == null)
            throw new NullPointerException("A sessão não foi inicializada ainda");
        return instance;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public final void validarAcesso(AcessoValidavel validavel) throws AcessoNegadoException{
        Permissao p = validavel.getPermissaoAtribuida();
        if (!this.usuario.getPermissoes().contains(p)){
            String mensagem = String.format("O usuário não possui permissão para acessar função %s", p);
            throw new AcessoNegadoException(mensagem, p);
        }
    }
    
}
